android -- String 格式化使用示例

前言

这篇文章已经拖了快一个月。。虽然简单,还是总结一下吧。

最近做项目的时候遇到群发短信消息的需求,然后有个短信模板,大致格式如下 :

{userName} 在 {appName} 中对您发布了新的消息 :{message} 快去查看吧。

也就是在创建短信消息体的时候会有 3 个变量 ,然后你估计会问,这有什么问题? 嗯,确实没啥大问题。
所以我们这里来讨论的,是对于这个消息体字符串的创建我们有哪些方法,而哪个方法又显得比较优雅。

字符串拼接的方法

1、首先最原始、最粗暴的方法,用 ”+“ 号拼接

1
2
3
4
private  String  createMessageBody(String userName , String appName,String message  ){ 
String messageBody = userName + "在" + appName + "中对您发布了新的消息 :" + message + " 快去查看吧。";
return messageBody;
}

貌似也没什么不好的地方,但这么多加号拼接在一起,恩, 有种 low low 的感觉

2、StringBuilder 拼接

1
2
3
4
5
6
7
8
9
10
private  String  createMessageBody(String userName , String appName,String message  ){
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append(userName)
.append("在")
.append(appName)
.append("中对您发布了新的消息 :")
.append(message)
.append("快去查看吧 。");
return stringBuilder.toString();
}

恩,这种方法貌似看起来也比较臃肿,可读性也不好。只是比第一种效率高,不会产生那么多对象。

3、字符串模板拼接

1
2
3
4
5
6
xml 中 :  <string name="message_body">%1$s在%2$s中对您发布了新的消息:%3$s。快去查看吧。</string>

private String createMessageBody(String userName , String appName,String message ){
String messageBody = getResources().getString(R.string.message_body,userName,appName,message);
return messageBody;
}

可以看到这种方法是需要首先在 string 文件夹下定义好完整的文字,然后在代码中通过 getString 方法,传入条件参数。
很显然,这种方法更符合开发规范,因为我们一般是要尽量避免在代码中直接明文写字符串的。

还有,对于支持多语言的应用,前两种方法就更不值得用了。

然后,我们来看一下 android 中 getString(@StringRes int id, Object... formatArgs) 这个方法内部是怎么实现的:

1
2
3
4
5
6
@NonNull
public String getString(@StringRes int id, Object... formatArgs) throws NotFoundException {
final String raw = getString(id);
return String.format(mResourcesImpl.getConfiguration().getLocales().get(0), raw,
formatArgs);
}

可以看到,最终调用的是 java 中 String 的 format 方法。

Java String 格式化

这个本来想详细列举一下,但是发现有一篇译文写得很详细,可以作为速查表:
isea533 – Java String 格式化示例

这里简单贴一下文章中常用的格式说明符:
20181225175236121.jpg
剩余的这里就不再讲解。。。直接结束

总结

恩,这就结束了(😂)

看起来像一篇水文(尴尬)

所以以后遇到需要字符串格式化或者拼接的时候可以优先考虑一下 String.format 方法。来减少直接在代码中输入文字。

PS : 前两天看的 kotlin 的字符串模板挺好用的,但是也相当于是直接硬编码了。

参考文章

isea533 – Java String 格式化示例


------------- 本文结束 感谢您的阅读 -------------